Connection poolの最大数を100にする
at ruby-jp slack #rails
2025/05/19
ohbarye
:github_octocat: 11:26 AM
以下の記事やpostにある、「RDS ProxyやPgBouncerなど外部のconnection poolを利用しつつRailsでは"100"のような大きな数を設定する」をやってみようかなと思うのですが、どなたか実践されている方いますか? or されてない場合どう思われますか?
https://island94.org/2024/09/secret-to-rails-database-connection-pool-size
https://x.com/nateberkopec/status/1899190599342842231
一般にRailsのconnection poolの値は (マルチスレッドサーバーの場合) スレッド数と同じに設定する
connection poolの値は小さすぎると問題が起きるため
一方、100のような値には到達不可能なので設定値が大きすぎても問題になるケースはほぼない
connectionは遅延作成されてプールに追加されるので、たとえ100を設定してもスレッド数5のアプリケーションは基本的に0~5個しかconnectionを生成しない(Thread.newしたりload_asyncしたりするケースを除く)
X (formerly Twitter)X (formerly Twitter)
Nate Berkopec (@nateberkopec) on X
I've been redpilled on ActiveRecord database pool sizes. Here's what you should do:
1. Use a connection pooler, like pgbouncer or RDS Proxy
2. Hardcode pool: 100 into database.yml
External db pooler > AR per-process pool
willnet
Monday at 11:44 AM
やってないですが、DB側のコネクション数を監視してるならやってもいいんじゃないかなと思っています
fusagiko
11:43 AM
railsやsidekiqからのDBコネクションをpgbouncerでまとめる構成ならマストドンの推奨構成ですし、僕も実用してますね
2017/4に建てて以来8年間特にトラブルは起きたことないです
fusagiko
11:51 AM
一つ注意する点があるとすれば、Railsはpgへの接続の際prepared_statementsを使うので、それを無効にしておかないとconnectionのpiningが発生してしまいます
https://railsguides.jp/configuring.html#:~:text=Active%20Record%E3%81%A7%E3%81%AF%E3%80%81Pr[…]E3%81%AB%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82
https://github.com/mastodon/mastodon/blob/2d13a41462c0777da09aeef34992bab3066c8c01/config/database.yml#L55 (edited)
RailsガイドRailsガイド
Rails アプリケーションの設定項目 - Railsガイド
Railsアプリケーションの基本的な設定方法(Config:コンフィグ)について解説します。
11:52
あと僕の構成はpumaやsidekiqと同じホストにpgbouncerを同居させる構成なので、別ホストでpgbouncerを立てる場合の冗長性とかはわからないです
RDS proxyのようなマネージドなら心配いらないかと思いますが
sue445
11:55 AM
Google Cloudで動かしているうちのGitLabだと「GitLab Rails -> pgbouncer -> Cloud SQL Auth Proxy -> Cloud SQL (PostgreSQL)」のような経路でつなぎにいってますが下記のような設定になっていました。(Cloud SQL以外は同一ホスト)
GitLab Rails: https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/database.yml.postgresql?ref_type=heads や実際のサーバ内のdatabase.ymlにはpoolがなかったのでおそらくRailsのデフォルト値になってそう
pgbouncer: pool_sizeはCloud SQL側のmax_connectionsよりもちょっと小さい数値に設定(Cloud SQLの管理自体にコネクション数を少し使うため)、max_client_conn(Railsからうけつけることのできるコネクション数)はむっちゃデカくしてる
Cloud SQL Auth Proxy : 認証用のproxyなのでコネクション数の設定はなかった
(edited)
GitLabGitLab
config/database.yml.postgresql · master · GitLab.org / GitLab · GitLab
GitLab is an open source end-to-end software development platform with built-in version control, issue tracking, code review, CI/CD, and more. Self-host GitLab on your own servers, in a...
tmtms
12:08 PM
pgbouncer のようなコネクションプーラーを使わずに、Rails のコネクションプールだけの場合に pool: 100 にすると何か問題あるんかしら
ohbarye
:github_octocat: 12:09 PM
おお、実践例ありがとうございます
:memo: 自分のプロダクトだとRDS Proxyをpoolerとしてすでに使っていて、これがあるならpool: 100でもいいんじゃないか?と思っての投稿でした
fusagiko
12:40 PM
RDS Proxyなりpgbouncerなりで最大接続数を制限するならrailsのほうはスレッド数の2倍とか多めでもよいのではと思いますね